import os
import json
import requests  # 使用 requests 库来发送 HTTP 请求
from flask import current_app

class AIFinanceScorer:
    def __init__(self):
        # 1. 初始化 AGICTO API 配置
        self.api_key = os.getenv('AGICTO_API_KEY')
        self.api_base_url = "https://api.agicto.cn"  # AGICTO API 的基础 URL
        self.model = "gpt-3.5-turbo"  # 请确认 AGICTO 支持的模型名称，可能不同

        if not self.api_key:
            raise ValueError("AGICTO_API_KEY 环境变量未设置")

    def generate_finance_score(self, user_data):
        """
        调用 AGICTO API 生成财务健康评分
        :param user_data: 用户财务数据字典
        :return: 评分结果字典
        """
        # ==================== 加入调试代码 ====================
        # print("-" * 50)
        # print("准备发送给 AI 的用户财务数据：")
        # # 使用 json.dumps 并加上 indent 参数，让输出的 JSON 格式更美观，便于阅读
        # print(json.dumps(user_data, ensure_ascii=False, indent=2, default=str)) 
        # print("-" * 50)
        # ======================================================
        # 定义 Decimal 转换函数，与之前相同
        def convert_decimal(obj):
            from decimal import Decimal
            if isinstance(obj, Decimal):
                return float(obj)
            raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable")

        # 构建提示词，与之前相同
        prompt = f"""
        请根据以下用户财务数据，按照以下规则进行财务健康评分(0-100分):
        
        评分规则:
        1. 收支平衡度(30分): 月均结余率=(月均收入-月均支出)/月均收入，越高得分越高
        2. 预算执行度(25分): 实际支出与预算的偏差程度，偏差越小得分越高
        3. 储蓄率(20分): 月均储蓄占收入比例，越高得分越高
        4. 消费结构(15分): 必要消费(饮食/住房等)占比合理度
        5. 收支稳定性(10分): 收入和支出的波动情况，越稳定得分越高
        
        用户数据:
        {json.dumps(user_data, ensure_ascii=False, indent=2, default=convert_decimal)}
        
        请严格返回以下格式的JSON，不要包含任何其他说明文字:
        {{
            "health_score": 评分,
            "score_detail": {{
                "balance_rate": 收支平衡度得分,
                "budget_execution": 预算执行度得分,
                "saving_rate": 储蓄率得分,
                "consumption_structure": 消费结构得分,
                "stability": 收支稳定性得分
            }},
            "suggestion": ["改进建议1", "改进建议2"]
        }}
        """

        # 2. 构建请求头和请求体
        headers = {
            "Authorization": f"Bearer {self.api_key}",  # 根据 AGICTO 文档确认
            "Content-Type": "application/json"
        }

        request_body = {
            "model": self.model,
            "messages": [
                {"role": "system", "content": "你是一位专业的财务分析师，擅长进行个人财务健康评估。"},
                {"role": "user", "content": prompt}
            ]
        }

        try:
            # 3. 发送 POST 请求到 AGICTO API
            response = requests.post(
                f"{self.api_base_url}/v1/chat/completions",  # 根据 AGICTO 文档确认
                headers=headers,
                json=request_body
            )

            # 4. 检查响应状态
            response.raise_for_status()  # 如果请求失败 (状态码 >= 400), 会抛出 HTTPError 异常

            # 5. 解析响应体
            response_data = response.json()

            # 根据 AGICTO 的响应格式提取内容
            # 假设格式与 OpenAI 类似
            if response_data and "choices" in response_data and len(response_data["choices"]) > 0:
                content = response_data["choices"][0]["message"]["content"]
                # 清理可能的代码块标记
                content = content.strip().strip("```json").strip("```").strip()
                result = json.loads(content)
                return result
            else:
                raise Exception(f"AGICTO API 返回格式不正确: {response_data}")

        except requests.exceptions.HTTPError as e:
            # 处理 HTTP 错误，例如 401 (未授权), 404 (未找到), 500 (服务器错误) 等
            error_msg = f"AGICTO API HTTP 错误: {e.response.status_code} - {e.response.text if e.response else 'No details'}"
            current_app.logger.error(error_msg)
            raise Exception(f"评分计算失败: API 请求错误 - {e.response.status_code if e.response else 'Unknown'}")
        except requests.exceptions.RequestException as e:
            # 处理网络连接等其他请求相关错误
            current_app.logger.error(f"AGICTO API 请求异常: {str(e)}")
            raise Exception(f"评分计算失败: 无法连接到 AI 服务 - {str(e)}")
        except json.JSONDecodeError as e:
            # 处理 JSON 解析错误
            current_app.logger.error(f"AGICTO 返回结果解析失败: {str(e)}")
            raise Exception(f"评分计算失败: AI 返回结果格式错误 - {str(e)}")
        except Exception as e:
            # 捕获其他所有异常
            current_app.logger.error(f"评分计算过程发生未知错误: {str(e)}")
            raise Exception(f"评分计算失败: {str(e)}")